﻿package zf.data.geom.plan
{
	import flash.display.Sprite;
	import flash.geom.Point;

	/**
	 * 正多边形模型类 
	 * @author Mike.zhang
	 * @langversion 3.0 
	 * @playerversion Flash 9 
	 * 
	 */
	public class RegularPolygon extends Plan implements IPlan
	{
		private var _corner:uint;
		private var _radius:Number;

		/**
		 * 创建一个正多边形模型 
		 * @param corner 正多边形顶点数，即边数
		 * @param radius 正多边形半径
		 * 
		 */
		public function RegularPolygon (corner:uint=3,radius:Number=50)
		{
			super ();
			_corner=corner;
			_radius=radius;
		}

		/**
		 *  
		 * 正多边形顶点数，即边数
		 * 
		 */
		public function get corner ():uint
		{
			return _corner;
		}

		public function set corner (v:uint):void
		{
			_corner=v;
		}

		/**
		 * 
		 * 正多边形半径
		 * 
		 */
		public function get radius ():Number
		{
			return _radius;
		}
		public function set radius (v:Number):void
		{
			_radius=v;
		}

		/**
		 * 获取正多边形的顶点数组集。
		 * 
		 * @inheritDoc
		 * @return 多边形的顶点数组集 
		 * @throws ArgumentError corner必须大于2，半径必须为数字
		 * 
		 */
		public function getPointData (x:Number=0,y:Number=0,rotation:Number=0):Array
		{
			rotation=rotation * Math.PI / 180;
			var nAngle:Number=2 * Math.PI / _corner;
			var dx:Number;
			var dy:Number;
			if (_corner > 2 && _radius is Number)
			{
				var data:Array=new Array  ;
				for (var i:uint=0; i < _corner; i++)
				{
					dx=Math.cos(nAngle * i + rotation) * _radius + x;
					dy=Math.sin(nAngle * i + rotation) * _radius + y;
					data.push (new Point(dx,dy));
				}
				return data;
			}
			else
			{
				throw new ArgumentError("正多边形参数错误！");
			}
			return new Array  ;
		}
		/**
		 * 绘制正多边形
		 * 在使用前需要设置填充及线条信息。 
		 * 
		 * @inheritDoc 
		 * @throws ArgumentError corner必须大于2，半径必须为数字
		 * 
		 */
		override public  function draw (target:Sprite,x:Number=0,y:Number=0,rotation:Number=0):void
		{
			rotation=rotation * Math.PI / 180;
			var nAngle:Number=2 * Math.PI / _corner;
			var dx:Number;
			var dy:Number;
			if (_corner > 2 && _radius is Number)
			{
				target.graphics.moveTo (x + Math.cos(rotation) * _radius,y + Math.sin(rotation) * _radius);
				for (var i:uint=1; i <= _corner; i++)
				{
					dx=Math.cos(nAngle * i + rotation) * _radius + x;
					dy=Math.sin(nAngle * i + rotation) * _radius + y;
					target.graphics.lineTo (dx,dy);
				}
			}
			else
			{
				throw new ArgumentError("正多边形参数错误！");
			}
		}
	}
}